#!/bin/sh

# .githooks/commit-msg

## install ： git config core.hooksPath githooks
## uninstall ： git config --unset core.hooksPath

# 获取提交信息
commit_msg=$(cat "$1")
first_line=$(echo "$commit_msg" | head -n1)

# ========================================
# 跳过格式检查的场景
# ========================================

# 1. 跳过合并提交（Merge commits）
if echo "$first_line" | grep -qE "^Merge (branch|remote-tracking branch|pull request)"; then
    echo "ℹ️  Merge commit detected, skipping format check..."
    exit 0
fi

# 2. 跳过 revert 提交
if echo "$first_line" | grep -qE "^Revert "; then
    echo "ℹ️  Revert commit detected, skipping format check..."
    exit 0
fi

# 3. 跳过初始提交（Initial commit）
if echo "$first_line" | grep -qE "^Initial commit"; then
    echo "ℹ️  Initial commit detected, skipping format check..."
    exit 0
fi

# 4. 通过环境变量跳过检查（可选）
# 使用方法: SKIP_COMMIT_HOOK=1 git commit -m "message"
if [ -n "$SKIP_COMMIT_HOOK" ]; then
    echo "ℹ️  SKIP_COMMIT_HOOK is set, skipping format check..."
    exit 0
fi

# ========================================
# 正常提交的格式检查
# ========================================

# 支持的提交类型
commit_regex='^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|temp|init|sql)(\(.+\))?: .{1,100}'

# 检查提交信息格式
if ! echo "$first_line" | grep -qE "$commit_regex"; then
    cat <<EOF

❌ Invalid commit message format.
   提交信息格式无效。

📋 Correct format:
   type(scope): subject

📖 Example:
   feat(user): add login functionality
   fix(api): resolve timeout issue
   docs(readme): update installation guide

📝 Allowed types:
┌──────────┬─────────────────────────────────────────────────────────────────┐
│ Type     │ Description                                                     │
├──────────┼─────────────────────────────────────────────────────────────────┤
│ feat     │ 新功能 - 产品新功能，用户可感知的变化（包括文案、样式修改）        │
│ fix      │ 缺陷修复 - 修复 bug                                            │
│ docs     │ 文档更新 - 更新文档或注释                                       │
│ style    │ 格式调整 - 代码格式修改，不影响逻辑（如 eslint 规范）           │
│ refactor │ 重构 - 代码优化，不影响现有功能或添加新功能                     │
│ test     │ 测试相关 - 单测相关变更                                        │
│ chore    │ 杂项 - 其他无法归类的变更，如代码合并                           │
│ perf     │ 性能优化 - 性能提升相关变更                                    │
│ ci       │ CI/CD - 持续集成脚本相关变更                                   │
│ build    │ 构建相关 - 构建脚本、webpack、gulp 等构建工具相关变更           │
│ temp     │ 临时代码 - 不计入 CHANGELOG 的临时变更                         │
│ init     │ 初始化 - 初始化项目                                           │
│ sql      │ 数据库 - SQL 相关变更                                         │
└──────────┴─────────────────────────────────────────────────────────────────┘

💡 Tips:
   - scope 是可选的，用于标识变更范围：如 feat(auth): add OAuth login
   - subject 长度建议控制在 50 字符以内，最多 100 字符
   - 使用现在时态：add 而不是 added
   - 首字母小写：feat(core): add new feature

🔧 Skip this check:
   - 如需临时跳过检查: SKIP_COMMIT_HOOK=1 git commit -m "your message"
   - 合并提交会自动跳过检查

EOF
    exit 1
fi

# 检查提交信息长度
subject_length=${#first_line}
if [ $subject_length -gt 100 ]; then
    cat <<EOF

⚠️  Warning: Commit message is too long ($subject_length characters)
   建议将提交信息控制在 100 字符以内

Current message:
$first_line

EOF
    exit 1
fi

# 检查是否有 temp 类型的提醒
if echo "$first_line" | grep -q "^temp"; then
    cat <<EOF

⚠️  Notice: This is a temporary commit (temp type)
   注意：这是临时提交，不会计入 CHANGELOG

EOF
fi

echo "✅ Commit message format is valid!"